﻿using GDM.Hogar.Controles.ControlesPersonalizados.Grilla;
using GDM.Hogar.Entidades;
using GDM.Hogar.Managers.Contratos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Configuracion
{
    public partial class TareaUC : UserControl, IUserControl
    {
        private readonly ITareaManager _tareaManager;

        private IList<Tarea> Datos { get; set; }

        private bool Editando { get; set; }

        public TareaUC(ITareaManager tareaManager)
        {
            if (tareaManager == null)
                throw new ArgumentNullException("tareaManager");

            _tareaManager = tareaManager;
            InitializeComponent();
        }

        public void LimpiarValidador()
        {
            this.validador1.Clear();
        }

        private void TareaUC_Load(object sender, EventArgs e)
        {
            Datos = _tareaManager.ObtenerTareas();
            cgTarea.Configure(Datos.AsQueryable());
            ttInfo.SetToolTip(btnEditarTarea, "Editar");
            if (cgTarea.Rows.Count <= 0) return;

            cgTarea.CurrentCell = null;
            cgTarea.ClearSelection();
        }

        private void RefrescarGrilla()
        {
            Datos = _tareaManager.ObtenerTareas();
            cgTarea.Search(Datos.AsQueryable(), x => true);
        }

        private void GuardarTarea()
        {
            try
            {
                int diasAnticipacion;
                int.TryParse(txtDiasAnticipacion.Text, out diasAnticipacion);
                _tareaManager.CrearTarea(txtNombre.Text.Trim(), diasAnticipacion);
                txtNombre.Clear();
                txtDiasAnticipacion.Clear();
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void ActualizarTarea(Tarea tarea)
        {
            try
            {
                _tareaManager.ActualizarTarea(tarea);
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void btnGuardarTarea_Click(object sender, EventArgs e)
        {
            if (!validador1.Validate()) return;

            if (!Editando)
            {
                GuardarTarea();
            }
            else
            {
                var tareaSeleccionada = (Tarea)cgTarea.SelectedRows[0].DataBoundItem;
                var nombreNuevo = txtNombre.Text.Trim();
                int diasAnticipacion;
                int.TryParse(txtDiasAnticipacion.Text, out diasAnticipacion);
                if (!tareaSeleccionada.Nombre.ToLower().Equals(nombreNuevo.ToLower()) || tareaSeleccionada.DiasAnticipacion != diasAnticipacion)
                {
                    tareaSeleccionada.Nombre = nombreNuevo;
                    tareaSeleccionada.DiasAnticipacion = diasAnticipacion;
                    ActualizarTarea(tareaSeleccionada);
                }
                CancelarEdicion();
            }
        }

        private void btnEditarTarea_Click(object sender, EventArgs e)
        {
            if (cgTarea.SelectedRows.Count == 0) return;

            Editando = true;
            var tareaSeleccionada = (Tarea)cgTarea.SelectedRows[0].DataBoundItem;
            txtNombre.Text = tareaSeleccionada.Nombre;
            txtDiasAnticipacion.Text = tareaSeleccionada.DiasAnticipacion.HasValue ? tareaSeleccionada.DiasAnticipacion.Value.ToString() : "";
            btnCancelar.Enabled = true;
        }

        private void CancelarEdicion()
        {
            Editando = false;
            txtNombre.Clear();
            txtDiasAnticipacion.Clear();
            btnCancelar.Enabled = false;
            validador1.Clear();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void cgTarea_SelectionChanged(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void validador1_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (!Editando)
            {
                e.Valid = !Datos.Any(x => x.Nombre.ToLower().Equals(txtNombre.Text.Trim().ToLower()));
            }
            else
            {
                var tareaSeleccionada = (Tarea)cgTarea.SelectedRows[0].DataBoundItem;
                e.Valid = !Datos.Any(x => x.TareaId != tareaSeleccionada.TareaId && x.Nombre.ToLower().Equals(txtNombre.Text.Trim().ToLower()));
            }
        }

        private void txtDiasAnticipacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar)
                && !char.IsDigit(e.KeyChar)
                && e.KeyChar != '.')
            {
                e.Handled = true;
            }
        }

        private void cgTarea_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            btnEditarTarea_Click(null, null);
        }
    }
}